package com.future;

/**
 * Description: 38. 外观数列
 * 前五项如下：
 * <p>
 * 1.     1
 * 2.     11
 * 3.     21
 * 4.     1211
 * 5.     111221
 * 第一项是数字 1
 * 描述前一项，这个数是 1 即 “ 一 个 1 ”，记作 "11"
 * 描述前一项，这个数是 11 即 “ 二 个 1 ” ，记作 "21"
 * 描述前一项，这个数是 21 即 “ 一 个 2 + 一 个 1 ” ，记作 "1211"
 * 描述前一项，这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ，记作 "111221"
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/count-and-say
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author weiruibai.vendor
 * Date: 2023/1/13 09:43
 */
public class Solution_38 {
    private static Solution_38 instance = new Solution_38();

    public static void main(String[] args) {
        int n = 5;

        String s = instance.countAndSay(n);
        System.out.println(s);
    }

    public String countAndSay(int n) {
        if (n == 1) {
            return "" + 1;
        }
        if (n == 2) {
            return "11";
        }
        String lastNum = "" + 1;
        String curNum = 11 + "";
        int curIndex = 2;
        while (curIndex < n) {
            lastNum = curNum;
            curNum = calcCurNum(lastNum);
            curIndex++;
        }

        return curNum;
    }

    private String calcCurNum(String lastNum) {
        StringBuilder nextNum = new StringBuilder();
        int N = lastNum.length();
        for (int i = 0; i < N; ) {
            char ch = lastNum.charAt(i);
            int j = i + 1;
            while (j < N && ch == lastNum.charAt(j)) {
                j++;
            }
            nextNum.append((j - i) + String.valueOf(ch));
            i = j;
        }
        return nextNum.toString();
    }
}
